package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

type Customer struct {
	Cid    int
	Name   string
	Age    int
	Gender string
	Email  string
}

var customers []Customer
var customerid int

func addCustomer() {
	//引导用户输入
	fmt.Printf("\033[1;35;45m%s\033[0m\n", "=========添加客户开始=========")
	var Name string
	fmt.Print("请输入客户姓名：")
	fmt.Scan(&Name)
	var Gender string
	fmt.Print("请输入客户性别：")
	fmt.Scan(&Gender)
	var Age int
	fmt.Print("请输入客户年龄：")
	fmt.Scan(&Age)
	var Email string
	fmt.Print("请输入客户邮箱：")
	fmt.Scan(&Email)

	//添加
	customerid++
	var newCustomer = Customer{Cid: customerid, Name: Name, Age: Age, Gender: Gender, Email: Email}
	customers = append(customers, newCustomer)
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========添加客户结束=========")
}
func viewCustomer() {
	//查看
	fmt.Printf("\033[1;35;45m%s\033[0m\n", "=========客户列表开始=========")
	for _, v := range customers {
		fmt.Printf("编号：%-4d 姓名：%-4s 年龄：%-4d 性别：%-4s 邮箱：%-8s\n", v.Cid, v.Name, v.Age, v.Gender, v.Email)
	}
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========客户列表结束=========")
}
func updateCustomer() {
	//修改
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========修改客户开始=========")
	for {
		//判断切片是否为空
		if len(customers) == 0 {
			break
		} else {
			var Cid int
			fmt.Print("请输入修改的客户编号：")
			fmt.Scan(&Cid)
			//判断客户的索引值，-1表示不存在
			var updateIndex = -1
			for index, cust := range customers {
				if cust.Cid == Cid {
					updateIndex = index
				}
			}
			if updateIndex == -1 {
				fmt.Println("该编号不存在！请重新输入")
				continue
			}
			//！！！获取更新的struct对象【这一点很关键，涉及到是否更新值的问题。结构体是值类型】
			updateCustomer := &customers[updateIndex]
			//引导用户输入
			var Name string
			fmt.Printf("请输入修改客户姓名(%s)：", updateCustomer.Name)
			fmt.Scanln(&Name)

			var Gender string
			fmt.Printf("请输入修改客户性别(%s)：", updateCustomer.Gender)
			fmt.Scanln(&Gender)

			var Age int
			fmt.Printf("请输入修改客户年龄(%d)：", updateCustomer.Age)
			fmt.Scanln(&Age)

			var Email string
			fmt.Printf("请输入修改客户邮箱(%s)：", updateCustomer.Email)
			fmt.Scanln(&Email)

			if Name != "" {
				updateCustomer.Name = Name
			}
			if Gender != "" {
				updateCustomer.Gender = Gender
			}
			if Age != 0 {
				updateCustomer.Age = Age
			}
			if Email != "" {
				updateCustomer.Email = Email
			}
			break
		}
	}
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========修改客户结束=========")
}
func deleteCustomer() {
	//删除
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========删除客户开始=========")
	for {
		//判断切片是否为空
		if len(customers) == 0 {
			break
		} else {
			var Cid int
			fmt.Print("请输入删除的客户编号：")
			fmt.Scan(&Cid)
			//判断客户的索引值，-1表示不存在
			var deleteIndex = -1
			for index, cust := range customers {
				if cust.Cid == Cid {
					deleteIndex = index
				}
			}
			if deleteIndex == -1 {
				fmt.Println("删除编号不存在！请重新输入")
				continue
			}

			customers = append(customers[:deleteIndex], customers[deleteIndex+1:]...)
			break
		}

	}
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========删除客户结束=========")
}
func saveCustomer() {
	//保存
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========从内存保存客户信息开始=========")
	//fmt.Println(":::", customers) //::: [{2 hankai 32 man 123}]
	data1, _ := json.Marshal(customers)
	ioutil.WriteFile("data.json", data1, 666)
	fmt.Printf("\033[1;35;55m%s\033[0m\n", "=========从内存保存客户信息结束=========")
}

func main() {
	for {
		fmt.Printf("\033[1;30;35m%s\033[0m\n", `
------------------客户关系管理------------------
		1、添加客户
		2、查看客户
		3、更新客户
		4、删除客户
		5、保存
		6、退出
---------------------------------------------
`)
		var choice int
		fmt.Print("请输入你的选择：")
		fmt.Scan(&choice)

		switch choice {
		case 1:
			addCustomer()
		case 2:
			viewCustomer()
		case 3:
			updateCustomer()
		case 4:
			deleteCustomer()
		case 5:
			saveCustomer()
		case 6:
			//退出，强制退出
			os.Exit(0)
		default:
			fmt.Println("输入不正确。")
		}
	}
}
